iT邦幫忙

DAY 11
5

實戰 Java SE 7 系列 第 11

Project Coin - 二進位數字表示法 - 完

  • 分享至 

  • xImage
  •  

上一篇提到 PrintStream.printf 只能輸出8, 10, 16三種進位格式,2進位該怎麼處理呢?Integer 類別裡有提供完整的方法,將數值在這四種進位和字串間轉換。

package idv.jacky.ironman4.day11;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Day11Example1 {

	public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        
        while(true) {
	        try {
	        	System.out.print("請輸入一個十進位數字:");
	        	
	            String number = in.readLine();
	            int integer = Integer.parseInt(number);
	            
	            System.out.printf("%s 的 2進位是 %s %n", number, Integer.toBinaryString(integer));
	            System.out.printf("%s 的 8進位是 %s %n", number, Integer.toOctalString(integer));
	            System.out.printf("%s 的16進位是 %s %n%n", number, Integer.toHexString(integer));
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
        }
	}
}


從上面的程式碼裡你可以看到,我們從命令列中讀取使用者所輸入的一個數字字串(第15行),然後使用 Integer.parseInt 的方法(第16行),轉成 int 型態。如果轉換失敗,例如不是標準的數字格式,這個方法會丟出 NumberFormatException 。接著,程式分別在第18,19和20行,分別使用 Integer.toBinaryString,Integer.toOctalString 和 Integer.toHexString 來將 int 型別的數值,轉換成2,8,16進位的字串

其實我們還可以讓程式更聰明一點,Integer.parseInt 有另外一個覆寫的方法,除了原本第一個數字字串外,還有第二個j數參數,所傳入的是這個字串是用什麼進位所表示的。如果要使用這個方法,我們必需先知道所輸入的字串數字是什麼進位。之前提到過,在 Java 程式碼為如果要表示2進位,則前面必需加上 0b,8進位要加上0,而16進位要加上0x。我們可以利用這個條件來判斷所輸入的字串,到底是什麼進位的數字字串。

package idv.jacky.ironman4.day11;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Day11Example2 {

	public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        
        while(true) {
	        try {
	        	System.out.print("請輸入一個數字:");
	        	
	            String number = in.readLine();
	            int radix = checkRadix(number);
	            
	            if (radix == 0) {
	            	System.out.println("你所輸入數字的格式不正確!");
	            	continue;
	            } else {
	            	//去掉前面的表示符號
	            	if (radix == 2 || radix == 16)
	            		number = number.substring(2);
	            	
	            	int integer = Integer.parseInt(number, radix);
		            System.out.printf("%s 的 2進位是 %s %n", number, Integer.toBinaryString(integer));
		            System.out.printf("%s 的 8進位是 %s %n", number, Integer.toOctalString(integer));
		            System.out.printf("%s 的10進位是 %s %n", number, Integer.toString(integer));
		            System.out.printf("%s 的16進位是 %s %n%n", number, Integer.toHexString(integer));
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
        }
	}
	
	public static int checkRadix(String number) {
		number = number.toLowerCase();
		if (number.startsWith("0x"))
			return 16;
		else if (number.startsWith("0")) {
			if (number.startsWith("0b"))
				return 2;
			else
				return 8;
		} else {
			try {
				Integer.parseInt(number);
				return 10;
			} catch (NumberFormatException e) {
				return 0;
			}
		}
	}
}

上面的程式碼裡,我們寫了一個 checkRadix 的方法,判斷的方式就是我們剛剛提到的。如果無法判斷,就回傳 0,要使用者重新輸入。這樣程式是不是更完整了呢?


上一篇
Project Coin - 二進位數字表示法 - 續
下一篇
Project Coin - 底線格式數值
系列文
實戰 Java SE 7 31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
krarm
iT邦好手 1 級 ‧ 2011-10-23 22:18:20

jackychu提到:
個數字字串(第15行),然後使用 Integer.parseInt 的方法(第16行),轉成 int 型態。如果轉換失敗,例如不是標準的數字格式,這個方法會丟出 NumberFormatException 。接著,程式分別在第18,19和20行,分別使用 Integer.toBi...(恕刪)

謝謝大大的分享,照亮我們這些java苦手。

jackychu iT邦新手 3 級 ‧ 2011-10-24 21:33:30 檢舉

謝謝支持~~ 記得按讚喔 讚

我要留言

立即登入留言